package application;

/**
 *
 * @author Laurent
 */
public class Mouvement {

    private int sensRotation;

    public int getSensRotation() {
        return sensRotation;
    }

    public double calculerAngle(double sourisX, double sourisY) {
        double angle;


        angle = Math.atan(sourisY / sourisX);

        angle = Math.toDegrees(angle);
        if (sourisX < 0 && sourisY > 0) {
            angle = 180 - Math.abs(angle);
        } else if (sourisX < 0 && sourisY < 0) {
            angle = 180 + angle;
        } else if (sourisX > 0 && sourisY < 0) {
            angle = 270 + 90 - Math.abs(angle);
        }

        return angle;
    }

    public double angleDeRotation(double angleVise, double angleActuel, double radDeRotation) {
        if (angleActuel < 0) {
            angleActuel = 358.0;
        } else if (angleActuel > 359.0) {
            angleActuel = 1;
        }


        int cadranActuel = 0;
        if (Math.sin(Math.toRadians(angleActuel)) > 0 && Math.cos(Math.toRadians(angleActuel)) > 0) {
            cadranActuel = 4;
        } else if (Math.sin(Math.toRadians(angleActuel)) > 0 && Math.cos(Math.toRadians(angleActuel)) < 0) {
            cadranActuel = 3;
        } else if (Math.sin(Math.toRadians(angleActuel)) < 0 && Math.cos(Math.toRadians(angleActuel)) < 0) {
            cadranActuel = 2;
        } else if (Math.sin(Math.toRadians(angleActuel)) < 0 && Math.cos(Math.toRadians(angleActuel)) > 0) {
            cadranActuel = 1;
        }

        int cadranVise = 0;
        if (Math.sin(Math.toRadians(angleVise)) > 0 && Math.cos(Math.toRadians(angleVise)) > 0) {
            cadranVise = 4;
        } else if (Math.sin(Math.toRadians(angleVise)) > 0 && Math.cos(Math.toRadians(angleVise)) < 0) {
            cadranVise = 3;
        } else if (Math.sin(Math.toRadians(angleVise)) < 0 && Math.cos(Math.toRadians(angleVise)) > 0) {
            cadranVise = 1;
        } else if (Math.sin(Math.toRadians(angleVise)) < 0 && Math.cos(Math.toRadians(angleVise)) < 0) {
            cadranVise = 2;
        }


        switch (cadranActuel) {
            case 4: {
                switch (cadranVise) {
                    case 4: {
                        if (angleActuel > angleVise) {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) - radDeRotation);
                            sensRotation = -1;
                        } else {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) + radDeRotation);
                            sensRotation = 1;
                        }
                    }

                    break;
                    case 3: {
                        angleActuel = Math.toDegrees(Math.toRadians(angleActuel) + radDeRotation);
                        sensRotation = 1;
                    }

                    break;
                    case 1: {
                        angleActuel = Math.toDegrees(Math.toRadians(angleActuel) - radDeRotation);
                        sensRotation = -1;
                    }

                    break;
                    case 2: {
                        if ((angleVise - angleActuel) >= 180) {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) + radDeRotation);
                            sensRotation = 1;
                        } else {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) - radDeRotation);
                            sensRotation = -1;
                        }
                    }

                    break;

                }
            }
            break;

            case 3: {
                switch (cadranVise) {
                    case 4: {
                        angleActuel = Math.toDegrees(Math.toRadians(angleActuel) - radDeRotation);
                        sensRotation = -1;
                    }

                    break;
                    case 3: {
                        if (angleActuel > angleVise) {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) - radDeRotation);
                            sensRotation = -1;
                        } else {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) + radDeRotation);
                            sensRotation = 1;
                        }
                    }

                    break;
                    case 1: {
                        if ((angleVise - angleActuel) >= 180) {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) - radDeRotation);
                            sensRotation = -1;
                        } else {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) + radDeRotation);
                            sensRotation = 1;
                        }

                    }

                    break;
                    case 2: {
                        angleActuel = Math.toDegrees(Math.toRadians(angleActuel) + radDeRotation);
                        sensRotation = 1;
                    }

                    break;

                }

            }
            break;

            case 1: {
                switch (cadranVise) {
                    case 4: {
                        angleActuel = Math.toDegrees(Math.toRadians(angleActuel) + radDeRotation);
                        sensRotation = 1;
                    }

                    break;
                    case 3: {
                        if ((angleActuel - angleVise) >= 180) {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) + radDeRotation);
                            sensRotation = 1;
                        } else {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) - radDeRotation);
                            sensRotation = -1;
                        }
                    }

                    break;
                    case 1: {
                        if (angleActuel > angleVise) {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) - radDeRotation);
                            sensRotation = -1;
                        } else {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) + radDeRotation);
                            sensRotation = 1;
                        }
                    }

                    break;
                    case 2: {
                        angleActuel = Math.toDegrees(Math.toRadians(angleActuel) - radDeRotation);
                        sensRotation = -1;
                    }

                    break;

                }

            }
            break;

            case 2: {
                switch (cadranVise) {
                    case 4: {
                        if ((angleActuel - angleVise) >= 180) {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) + radDeRotation);
                            sensRotation = 1;
                        } else {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) - radDeRotation);
                            sensRotation = -1;
                        }
                    }

                    break;
                    case 3: {
                        angleActuel = Math.toDegrees(Math.toRadians(angleActuel) - radDeRotation);
                        sensRotation = -1;
                    }

                    break;
                    case 1: {
                        angleActuel = Math.toDegrees(Math.toRadians(angleActuel) + radDeRotation);
                        sensRotation = 1;
                    }

                    break;
                    case 2: {
                        if (angleActuel > angleVise) {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) - radDeRotation);
                            sensRotation = -1;
                        } else {
                            angleActuel = Math.toDegrees(Math.toRadians(angleActuel) + radDeRotation);
                            sensRotation = 1;
                        }
                    }

                    break;

                }
            }

            break;
        }

        return angleActuel;

    }

    public double[] bougerElement(int xDepart, int yDepart, int xCible, int yCible, double vitesse) {
        try {            
            double[] positionXY = new double[2];
            double i, j;
            double angle;            
            double deplacementX = (xCible - xDepart);
            double deplacementY = (yCible - yDepart);
           
            
            angle = Math.abs(Math.atan(deplacementY / deplacementX));
             
//            if(deplacementX==0&&deplacementY!=0) {
//                i=0;
//                j=1;
//            } else if(deplacementY==0&&deplacementX!=0) {
//                j=0;
//                i=1;
//            }
            
            if (deplacementX< 0 && deplacementY > 0) {
                i = -Math.cos(angle);
                j = Math.sin(angle);
            } else if (deplacementX < 0 && deplacementY < 0) {
                i = -Math.cos(angle);
                j = -Math.sin(angle);
            } else if (deplacementX > 0 && deplacementY < 0) {
                i = Math.cos(angle);
                j = -Math.sin(angle);
            } else {
                i = Math.cos(angle);
                j = Math.sin(angle);
            }

            positionXY[0] = xDepart + i * vitesse;
            positionXY[1] = yDepart + j * vitesse;

            return positionXY;
        } catch (java.lang.ArithmeticException ar) {
            
            double[] positionXY = {xDepart, yDepart};            
            return positionXY;
        }

    }

    public double[] getIJ(int xDepart, int yDepart, int xCible, int yCible) {

        double deplacementX = (xCible - xDepart);
        double deplacementY = (yCible - yDepart);
        double i, j;
        double angle;

        angle = Math.abs(Math.atan(deplacementY / deplacementX));


        if (deplacementX < 0 && deplacementY > 0) {
            i = -Math.cos(angle);
            j = Math.sin(angle);
        } else if (deplacementX < 0 && deplacementY < 0) {
            i = -Math.cos(angle);
            j = -Math.sin(angle);
        } else if (deplacementX > 0 && deplacementY < 0) {
            i = Math.cos(angle);
            j = -Math.sin(angle);
        } else {
            i = Math.cos(angle);
            j = Math.sin(angle);
        }
        
        double[] IJ = {i, j};
        return IJ;


    }
}
